library(dplyr)
library(ggplot2)
library(lubridate)
library(naniar)
library(tidyr)
library(skimr)
library(stringr)
library(plotly)
library(xtable)
blue_theme <- function() {
  theme(
    # add border
    panel.border = element_rect(colour = "blue", fill = NA, linetype = 2),
    # color background
    panel.background = element_rect(fill = "aliceblue"),
    # modify grid
    panel.grid.major.x = element_line(colour = "steelblue", linetype = 3, linewidth = 0.5),
    panel.grid.minor.x = element_blank(),
    panel.grid.major.y =  element_line(colour = "steelblue", linetype = 3, linewidth = 0.5),
    panel.grid.minor.y = element_blank(),
    # modify text, axis and colour
    axis.text = element_text(colour = "steelblue", face = "italic"),
    axis.title = element_text(colour = "steelblue"),
    axis.ticks = element_line(colour = "steelblue"),
    # text elements
    plot.title = element_text(size = 16, face = 'bold', hjust = 0, vjust = 2, color="steelblue"),
    plot.subtitle = element_text(size = 12),
    plot.caption = element_text(size = 9, hjust = 1),
    # legend at the bottom
    legend.position = "bottom"
  )
}
# Chargement du jeu de données PhD_v3 
PhD_v3 <- read.csv("PhD_v3.csv", header=TRUE, fileEncoding="UTF-8")
glimpse(PhD_v3)
## Rows: 448,047
## Columns: 23
## $ X                                        <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,…
## $ Auteur                                   <chr> "Saeed Al marri", "Andrea Ram…
## $ Identifiant.auteur                       <chr> "", "174423705", "", "", "", …
## $ Titre                                    <chr> "Le credit documentaire et l'…
## $ Directeur.de.these                       <chr> "Philippe Delebecque", "Jean-…
## $ Directeur.de.these..nom.prenom.          <chr> "Delebecque Philippe", "Grand…
## $ Identifiant.directeur                    <chr> "29561248", "715,441,511", "5…
## $ Etablissement.de.soutenance              <chr> "Paris 1", "Chasseneuil-du-Po…
## $ Identifiant.etablissement                <chr> "27361802", "28024400", "", "…
## $ Discipline                               <chr> "Driot prive", "Mecanique des…
## $ Statut                                   <chr> "enCours", "enCours", "souten…
## $ Date.de.premiere.inscription.en.doctorat <chr> "30-09-11", "01-10-12", "", "…
## $ Date.de.soutenance                       <chr> "", "", "01-01-93", "", "", "…
## $ Year                                     <dbl> NA, NA, 1993, NA, NA, 2008, 2…
## $ Langue.de.la.these                       <chr> "na", "na", "fr", "na", "na",…
## $ Identifiant.de.la.these                  <chr> "s69480", "s98826", "1993NAN1…
## $ Accessible.en.ligne                      <chr> "non", "non", "non", "non", "…
## $ Publication.dans.theses.fr               <chr> "26-01-12", "22-11-13", "24-0…
## $ Mise.a.jour.dans.theses.fr               <chr> "26-01-12", "22-11-13", "17-1…
## $ Discipline_prÃ.di                        <chr> "Droit et Science Politique",…
## $ Genre                                    <chr> "male", "female", "male", "ma…
## $ etablissement_rec                        <chr> "Université Paris 1 - Panthéo…
## $ Langue_rec                               <chr> NA, NA, "Français", NA, NA, N…
skim(PhD_v3)
Data summary
Name PhD_v3
Number of rows 448047
Number of columns 23
_______________________
Column type frequency:
character 21
numeric 2
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
Auteur 0 1.00 1 102 0 430273 3
Identifiant.auteur 0 1.00 0 58 130347 313772 0
Titre 0 1.00 0 17963 7 446817 4
Directeur.de.these 0 1.00 0 123 13 159020 2
Directeur.de.these..nom.prenom. 0 1.00 0 123 13 159022 2
Identifiant.directeur 0 1.00 1 11 0 98906 0
Etablissement.de.soutenance 0 1.00 0 127 1 568 0
Identifiant.etablissement 0 1.00 0 9 17082 573 0
Discipline 0 1.00 1 1474 0 24262 0
Statut 0 1.00 7 8 0 2 0
Date.de.premiere.inscription.en.doctorat 0 1.00 0 8 383716 4010 0
Date.de.soutenance 0 1.00 0 8 57086 3992 0
Langue.de.la.these 0 1.00 2 8 0 206 0
Identifiant.de.la.these 0 1.00 2 24 0 447567 0
Accessible.en.ligne 0 1.00 3 3 0 2 0
Publication.dans.theses.fr 0 1.00 8 8 0 2765 0
Mise.a.jour.dans.theses.fr 0 1.00 0 8 177 2634 0
Discipline_prÃ.di 0 1.00 3 29 0 15 0
Genre 0 1.00 4 13 0 6 0
etablissement_rec 0 1.00 0 150 3074 111 0
Langue_rec 64120 0.86 5 8 0 4 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
X 0 1.00 224023.00 129340.17 0 112011.5 224023 336034.5 448046 ▇▇▇▇▇
Year 57086 0.87 2003.25 9.85 1971 1994.0 2004 2012.0 2020 ▁▃▇▇▇
# Correction nom de variable (erreur de conversion lors du chargement du fichier .csv)
PhD_v3b <- PhD_v3 %>%
  rename("Discipline_predi" = "Discipline_prÃ.di")

# Correction des erreurs de conversion des accents dans le reste du df
PhD_v3b <- PhD_v3b %>%
  mutate(Discipline_predi= str_replace_all(Discipline_predi, "é", "e"))

# Suppression de la première colonne inutile
PhD_v3b <- PhD_v3b[, -1]

# Vérification
glimpse(PhD_v3b)
## Rows: 448,047
## Columns: 22
## $ Auteur                                   <chr> "Saeed Al marri", "Andrea Ram…
## $ Identifiant.auteur                       <chr> "", "174423705", "", "", "", …
## $ Titre                                    <chr> "Le credit documentaire et l'…
## $ Directeur.de.these                       <chr> "Philippe Delebecque", "Jean-…
## $ Directeur.de.these..nom.prenom.          <chr> "Delebecque Philippe", "Grand…
## $ Identifiant.directeur                    <chr> "29561248", "715,441,511", "5…
## $ Etablissement.de.soutenance              <chr> "Paris 1", "Chasseneuil-du-Po…
## $ Identifiant.etablissement                <chr> "27361802", "28024400", "", "…
## $ Discipline                               <chr> "Driot prive", "Mecanique des…
## $ Statut                                   <chr> "enCours", "enCours", "souten…
## $ Date.de.premiere.inscription.en.doctorat <chr> "30-09-11", "01-10-12", "", "…
## $ Date.de.soutenance                       <chr> "", "", "01-01-93", "", "", "…
## $ Year                                     <dbl> NA, NA, 1993, NA, NA, 2008, 2…
## $ Langue.de.la.these                       <chr> "na", "na", "fr", "na", "na",…
## $ Identifiant.de.la.these                  <chr> "s69480", "s98826", "1993NAN1…
## $ Accessible.en.ligne                      <chr> "non", "non", "non", "non", "…
## $ Publication.dans.theses.fr               <chr> "26-01-12", "22-11-13", "24-0…
## $ Mise.a.jour.dans.theses.fr               <chr> "26-01-12", "22-11-13", "17-1…
## $ Discipline_predi                         <chr> "Droit et Science Politique",…
## $ Genre                                    <chr> "male", "female", "male", "ma…
## $ etablissement_rec                        <chr> "Université Paris 1 - Panthéo…
## $ Langue_rec                               <chr> NA, NA, "Français", NA, NA, N…
levels(as.factor(PhD_v3b$Discipline_predi))
##  [1] "Biologie"                      "Droit et Science Politique"   
##  [3] "Economie Gestion"              "Informatique"                 
##  [5] "Langues et Litteratures"       "Materiaux, Milieux et Chimie" 
##  [7] "Mathematiques"                 "Mathematiques et Informatique"
##  [9] "Medecine"                      "Poubelle"                     
## [11] "Psychologie"                   "Science de l'ingenieur"       
## [13] "Science de la Terre"           "Sciences de l'education"      
## [15] "SHS"
# calcul du nombre de doublon dans le df (ligne/observations 100% identiques)
sum(duplicated(PhD_v3b))
## [1] 412
# Affichage des lignes/observations concernées
duplicated_rows <- PhD_v3b[duplicated(PhD_v3b), ]
head(duplicated_rows)
# Retrait des doublons
PhD_v3b <- PhD_v3b %>%
  distinct()

# Verification
duplicated_rows <- PhD_v3b[duplicated(PhD_v3b), ]
head(duplicated_rows)
# Correction des types de variable : modification en date
PhD_v3b$Date.de.premiere.inscription.en.doctorat <- as.Date(PhD_v3b$Date.de.premiere.inscription.en.doctorat, format="%Y-%m-%d")
PhD_v3b$Date.de.soutenance <- as.Date(PhD_v3b$Date.de.soutenance, format="%Y-%m-%d")

# Correction des types de variable : modification en variable de type catégoriel
PhD_v3b <- PhD_v3b %>%
  mutate_at(vars(Discipline, Discipline_predi, Langue_rec, Genre), as.factor)


## Complétion du dataset : tranformation des valeurs vides ou empty ("") des variables de type "char" par NA
PhD_v3b <- PhD_v3b %>% 
  mutate_if(is.character, ~ str_trim(.)) %>%  # Supprime les espaces avant et après la chaîne
  mutate_if(is.character, ~ na_if(., ""))     # Remplace les chaînes vides par NA

## Correction des problèmes de typographie sur les NA (certaines étant inscrites en minuscule "na")
PhD_v3b <- PhD_v3b %>% mutate_if(is.character, ~na_if(., "na"))

# Remplacer le point par un espace dans les noms des colonnes
names(PhD_v3b) <- gsub("\\.", " ", names(PhD_v3b))

# Renomer certaines colonnes pour une meilleure lisibilité des graphiques
PhD_v3b <- PhD_v3b %>%
  rename(
    "Publication dans theses.fr" = "Publication dans theses fr",
    "Mise a jour dans theses.fr" = "Mise a jour dans theses fr",
    "Directeur de these (nom_prenom)" = "Directeur de these  nom prenom "
  )


# Vérification des opérations
glimpse(PhD_v3b)
## Rows: 447,635
## Columns: 22
## $ Auteur                                     <chr> "Saeed Al marri", "Andrea R…
## $ `Identifiant auteur`                       <chr> NA, "174423705", NA, NA, NA…
## $ Titre                                      <chr> "Le credit documentaire et …
## $ `Directeur de these`                       <chr> "Philippe Delebecque", "Jea…
## $ `Directeur de these (nom_prenom)`          <chr> "Delebecque Philippe", "Gra…
## $ `Identifiant directeur`                    <chr> "29561248", "715,441,511", …
## $ `Etablissement de soutenance`              <chr> "Paris 1", "Chasseneuil-du-…
## $ `Identifiant etablissement`                <chr> "27361802", "28024400", NA,…
## $ Discipline                                 <fct> "Driot prive", "Mecanique d…
## $ Statut                                     <chr> "enCours", "enCours", "sout…
## $ `Date de premiere inscription en doctorat` <date> 0030-09-11, 0001-10-12, NA…
## $ `Date de soutenance`                       <date> NA, NA, NA, NA, NA, 0024-1…
## $ Year                                       <dbl> NA, NA, 1993, NA, NA, 2008,…
## $ `Langue de la these`                       <chr> NA, NA, "fr", NA, NA, NA, N…
## $ `Identifiant de la these`                  <chr> "s69480", "s98826", "1993NA…
## $ `Accessible en ligne`                      <chr> "non", "non", "non", "non",…
## $ `Publication dans theses.fr`               <chr> "26-01-12", "22-11-13", "24…
## $ `Mise a jour dans theses.fr`               <chr> "26-01-12", "22-11-13", "17…
## $ Discipline_predi                           <fct> "Droit et Science Politique…
## $ Genre                                      <fct> male, female, male, male, m…
## $ etablissement_rec                          <chr> "Université Paris 1 - Panth…
## $ Langue_rec                                 <fct> NA, NA, Français, NA, NA, N…
# décharge de la mémoire
rm(PhD_v3)
rm(duplicated_rows)

# Export de la base de données propre
write.csv(PhD_v3b, "PhD_v3_clean.csv")
##                                                                          Variable
## Auteur                                                                     Auteur
## Identifiant auteur                                             Identifiant auteur
## Titre                                                                       Titre
## Directeur de these                                             Directeur de these
## Directeur de these (nom_prenom)                   Directeur de these (nom_prenom)
## Identifiant directeur                                       Identifiant directeur
## Etablissement de soutenance                           Etablissement de soutenance
## Identifiant etablissement                               Identifiant etablissement
## Discipline                                                             Discipline
## Statut                                                                     Statut
## Date de premiere inscription en doctorat Date de premiere inscription en doctorat
## Date de soutenance                                             Date de soutenance
## Year                                                                         Year
## Langue de la these                                             Langue de la these
## Identifiant de la these                                   Identifiant de la these
## Accessible en ligne                                           Accessible en ligne
## Publication dans theses.fr                             Publication dans theses.fr
## Mise a jour dans theses.fr                             Mise a jour dans theses.fr
## Discipline_predi                                                 Discipline_predi
## Genre                                                                       Genre
## etablissement_rec                                               etablissement_rec
## Langue_rec                                                             Langue_rec
##                                          Nbr_NA      Type Nbr_Levels
## Auteur                                        3 character         NA
## Identifiant auteur                       129983 character         NA
## Titre                                        11 character         NA
## Directeur de these                           15 character         NA
## Directeur de these (nom_prenom)              15 character         NA
## Identifiant directeur                     49168 character         NA
## Etablissement de soutenance                   1 character         NA
## Identifiant etablissement                 17082 character         NA
## Discipline                                    0    factor      24262
## Statut                                        0 character         NA
## Date de premiere inscription en doctorat 383991      Date         NA
## Date de soutenance                       221165      Date         NA
## Year                                      56738   numeric         NA
## Langue de la these                        63760 character         NA
## Identifiant de la these                       0 character         NA
## Accessible en ligne                           0 character         NA
## Publication dans theses.fr                    0 character         NA
## Mise a jour dans theses.fr                  177 character         NA
## Discipline_predi                              0    factor         15
## Genre                                         0    factor          6
## etablissement_rec                          3723 character         NA
## Langue_rec                                63760    factor          4
## % latex table generated in R 4.3.1 by xtable 1.8-4 package
## % Sat Aug 19 01:43:05 2023
## \begin{table}[ht]
## \centering
## \begin{tabular}{lrlr}
##   \hline
## Variable & Nbr\_NA & Type & Nbr\_Levels \\ 
##   \hline
## Auteur &   3 & character &  \\ 
##   Identifiant auteur & 129983 & character &  \\ 
##   Titre &  11 & character &  \\ 
##   Directeur de these &  15 & character &  \\ 
##   Directeur de these (nom\_prenom) &  15 & character &  \\ 
##   Identifiant directeur & 49168 & character &  \\ 
##   Etablissement de soutenance &   1 & character &  \\ 
##   Identifiant etablissement & 17082 & character &  \\ 
##   Discipline &   0 & factor & 24262 \\ 
##   Statut &   0 & character &  \\ 
##   Date de premiere inscription en doctorat & 383991 & Date &  \\ 
##   Date de soutenance & 221165 & Date &  \\ 
##   Year & 56738 & numeric &  \\ 
##   Langue de la these & 63760 & character &  \\ 
##   Identifiant de la these &   0 & character &  \\ 
##   Accessible en ligne &   0 & character &  \\ 
##   Publication dans theses.fr &   0 & character &  \\ 
##   Mise a jour dans theses.fr & 177 & character &  \\ 
##   Discipline\_predi &   0 & factor &  15 \\ 
##   Genre &   0 & factor &   6 \\ 
##   etablissement\_rec & 3723 & character &  \\ 
##   Langue\_rec & 63760 & factor &   4 \\ 
##    \hline
## \end{tabular}
## \end{table}

Exercice 1

# création du df de travail pour l'exercice
df_disc <- PhD_v3b %>%
  filter(Year >= "1985" & Year <= "2018")

# Area plot basic
# Compte le nombre de thèses dans chaque Discipline_predi pour chaque année
df_disc.an <- df_disc %>% 
  group_by(Year, Discipline_predi) %>% 
  count()
colnames(df_disc.an) <- c ("Year", "Discipline_predi", "Disc_predi.an")

# compte le nombre total de thèses par années
df_an <- df_disc %>%
  group_by(Year) %>%
  count()
colnames(df_an) <- c ("Year", "Disc_tot.an")

# Construction de la df intermediaire pour le calcul des proportions
df_disc.an2 <- full_join(df_disc.an, df_an, by = "Year") 

# Calcul des proportions annuelle par Discipline_predi
df_disc.an2 <- df_disc.an2 %>%
  mutate(df_disc.an2.sum.perc = round((Disc_predi.an / Disc_tot.an)*100, 2))

# Créer le graphique basic
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_area(position = "stack") +
  labs(x = "Date", y = "Nombre de thèses", fill = "Discipline",
       title = "Evolution du nombre de thèses par disciplines",
       subtitle = "Période 1985-2018") +
  theme(plot.margin = margin(0.75, 1, 0, 0, "cm")) +
  blue_theme() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# création du stacked barplot
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines", 
       title = "Evolution du nombre de thèses par disciplines",
       subtitle = "Période 1985-2018") + 
  theme(plot.margin = margin(0.75, 1, 0, 0, "cm")) +
  labs(fill="Disciplines") + 
  blue_theme()

Exercice 1 : area chart avec ordre des disciplines modifiés

# Catégories
categories <- c("Biologie", "Droit et Science Politique", "Economie Gestion", "Informatique",
                "Langues et Litteratures", "Materiaux, Milieux et Chimie", "Mathematiques",
                "Mathematiques et Informatique", "Medecine", "Poubelle", "Psychologie",
                "Science de l'ingenieur", "Science de la Terre", "Sciences de l'education", "SHS")

# Organiser les catégories
new_order <- c("Medecine", "Biologie", setdiff(categories, c("Medecine", "Biologie")))

# 
df_disc.an2$Discipline_predi <- factor(df_disc.an2$Discipline_predi, levels = new_order)
df_disc.an2$Discipline_predi[df_disc.an2$Discipline_predi == "Poubelle"] <- NA

df_disc.an2 <- df_disc.an2 %>%
  drop_na(Discipline_predi)


# Créer le graphique basic
p <- ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_area(position = "stack", linewidth = 0.8, na.rm = TRUE) +
  labs(x = "Date", y = "Nombre de thèses", fill = "Discipline",
       title = "Evolution du nombre de thèses par disciplines",
       subtitle = "Période 1985-2018") +
  theme(plot.margin = margin(0.75, 1, 0, 0, "cm")) +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + 
  blue_theme()
p

# Sauvegarder le graphique au format PNG
ggsave(filename = "area_chart.png", plot = p)

Exercice 1bis : supplément personnel pour rapport (tableau + code latex)

# Filtrer le dataframe pour les années 1985 et 2018
filtered_df <- df_disc.an2[df_disc.an2$Year %in% c(1985, 2002, 2018), ]

# Afficher le dataframe filtré
print(filtered_df)
## # A tibble: 42 × 5
## # Groups:   Year, Discipline_predi [42]
##     Year Discipline_predi         Disc_predi.an Disc_tot.an df_disc.an2.sum.perc
##    <dbl> <fct>                            <int>       <int>                <dbl>
##  1  1985 Biologie                           695        3007                23.1 
##  2  1985 Droit et Science Politi…           168        3007                 5.59
##  3  1985 Economie Gestion                   220        3007                 7.32
##  4  1985 Informatique                        45        3007                 1.5 
##  5  1985 Langues et Litteratures            268        3007                 8.91
##  6  1985 Materiaux, Milieux et C…           331        3007                11.0 
##  7  1985 Mathematiques                      120        3007                 3.99
##  8  1985 Mathematiques et Inform…             2        3007                 0.07
##  9  1985 Medecine                           434        3007                14.4 
## 10  1985 Psychologie                         94        3007                 3.13
## # ℹ 32 more rows
# Pour l'année 1985
top5_1985 <- filtered_df %>%
  filter(Year == 1985) %>%
  arrange(desc(df_disc.an2.sum.perc)) %>%
  head(5)

# Pour l'année 2002
top5_2002 <- filtered_df %>%
  filter(Year == 2002) %>%
  arrange(desc(df_disc.an2.sum.perc)) %>%
  head(5)

# Pour l'année 2018
top5_2018 <- filtered_df %>%
  filter(Year == 2018) %>%
  arrange(desc(df_disc.an2.sum.perc)) %>%
  head(5)

# Afficher les résultats
print(top5_1985)
## # A tibble: 5 × 5
## # Groups:   Year, Discipline_predi [5]
##    Year Discipline_predi          Disc_predi.an Disc_tot.an df_disc.an2.sum.perc
##   <dbl> <fct>                             <int>       <int>                <dbl>
## 1  1985 Biologie                            695        3007                23.1 
## 2  1985 Medecine                            434        3007                14.4 
## 3  1985 SHS                                 380        3007                12.6 
## 4  1985 Materiaux, Milieux et Ch…           331        3007                11.0 
## 5  1985 Langues et Litteratures             268        3007                 8.91
print(top5_2018)
## # A tibble: 5 × 5
## # Groups:   Year, Discipline_predi [5]
##    Year Discipline_predi          Disc_predi.an Disc_tot.an df_disc.an2.sum.perc
##   <dbl> <fct>                             <int>       <int>                <dbl>
## 1  2018 Biologie                           3245       12805                25.3 
## 2  2018 Materiaux, Milieux et Ch…          2469       12805                19.3 
## 3  2018 SHS                                1525       12805                11.9 
## 4  2018 Science de l'ingenieur             1396       12805                10.9 
## 5  2018 Informatique                        777       12805                 6.07
# Regrouper les dataframes par lignes en utilisant rbind
tableau2 <- rbind(top5_1985, top5_2002)
tableau2 <- rbind(tableau2, top5_2018)

# Réorganiser les colonnes si nécessaire
colnames(tableau2) <- c("Year", "Discipline_predi", "Thèses par discipline", "Total thèses soutenues", "% thèses par disc.")

tableau2 <- tableau2[, c(1:3)]

# Afficher le dataframe résultant
print(tableau2)
## # A tibble: 15 × 3
## # Groups:   Year, Discipline_predi [15]
##     Year Discipline_predi             `Thèses par discipline`
##    <dbl> <fct>                                          <int>
##  1  1985 Biologie                                         695
##  2  1985 Medecine                                         434
##  3  1985 SHS                                              380
##  4  1985 Materiaux, Milieux et Chimie                     331
##  5  1985 Langues et Litteratures                          268
##  6  2002 Biologie                                        2394
##  7  2002 Materiaux, Milieux et Chimie                    1779
##  8  2002 SHS                                             1177
##  9  2002 Science de l'ingenieur                           837
## 10  2002 Droit et Science Politique                       715
## 11  2018 Biologie                                        3245
## 12  2018 Materiaux, Milieux et Chimie                    2469
## 13  2018 SHS                                             1525
## 14  2018 Science de l'ingenieur                          1396
## 15  2018 Informatique                                     777

Exercice 2

p2 <- ggplot(df_disc , aes(x = Year, fill = Langue_rec)) +
  geom_histogram(position="fill", color="#e9ecef", binwidth = 1) +
  labs(x = "Années", y = "Thèses (%)") +  
  ggtitle("Distribution des langues de rédaction entre 1985 et 2018") +
  theme(plot.margin = margin(0.75, 1, 0, 0, "cm")) +
  labs(fill="Langues") + 
  blue_theme()
p2

# Sauvegarde du graphique
ggsave(filename = "hist_fill.png", plot = p2)
ggplot(df_disc , aes(x = Year, fill = Langue_rec)) +
  geom_histogram(position="fill", color="#e9ecef", binwidth = 1, alpha = 0.65) +
  labs(x = "Années", y = "Disciplines (%)") +  
  ggtitle("Distribution des langues de rédaction entre 1985 et 2018") +
  labs(fill="Langues") +
  theme(plot.margin = margin(0.75, 1, 0, 0, "cm")) +
  blue_theme()

ggplot(df_disc , aes(x = Year, fill = Langue_rec)) +
  geom_histogram(position="fill", color="#e9ecef", binwidth = 1, alpha = 0.4) +
  labs(x = "Années", y = "Disciplines (%)") +  
  ggtitle("Distribution des langues de rédaction entre 1985 et 2018") +
  labs(fill="Langues") +
  theme(plot.margin = margin(0.75, 1, 0, 0, "cm")) +
  blue_theme()

Exercice 2bis : supplément personnel pour rapport (tableau commentaire + code latex)

tableau3 <- df_disc %>%
  filter(Year %in% c(1985, 2002, 2018)) %>%
  group_by(Year, Langue_rec) %>%
  count() %>%
  arrange(n)

# Afficher le dataframe résultant
print(tableau3)
## # A tibble: 14 × 3
## # Groups:   Year, Langue_rec [14]
##     Year Langue_rec     n
##    <dbl> <fct>      <int>
##  1  1985 Autre          6
##  2  1985 Anglais       11
##  3  2002 <NA>          44
##  4  1985 Bilingue      73
##  5  2002 Autre        100
##  6  2018 Autre        155
##  7  2002 Anglais      177
##  8  2002 Bilingue     404
##  9  2018 <NA>         673
## 10  2018 Bilingue     741
## 11  1985 Français    2917
## 12  2018 Anglais     3429
## 13  2018 Français    7807
## 14  2002 Français    8671

Exercice 3

ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) +
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0))) +
  blue_theme()

ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0))) +
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) + 
  theme(axis.text.x = element_text(margin = margin(t = 50, r = 0, b = 0 , l = 0))) + 
  blue_theme()

ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) + 
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0)),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) + 
  blue_theme()

Exercice 4

# charger les polices
library(extrafont)
loadfonts(device = "win")

# même graphique avec des polices différentes
ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) + 
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0)),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1),
        text = element_text(family = "Garamond")) 

# même graphique avec des tailles de polices différentes pour l'axe X
ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) + 
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0), size = 20),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1, size = 14),
        text = element_text(family = "Garamond")) 

# même graphique avec des tailles de polices différentes pour les deux axes
ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) + 
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0), size = 20),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1, size = 14),
        axis.title.y = element_text(size = 20),
        axis.text.y = element_text(size = 14),
        text = element_text(family = "Garamond")) 

# même graphique avec des tailles de polices différentes pour les deux axes et le titre
ggplot(df_disc , aes(x = Year, fill = Genre)) +
  geom_histogram(position="dodge", color="#e9ecef", binwidth = 5) +
  labs(x = "Années", y = "Nb. de thèses") +  
  ggtitle("Distribution des thèses par genre entre 1985 et 2018") +
  labs(fill="Genres") + 
  theme(plot.margin = margin(0.5, 1, 0.5, 0, "cm")) + 
  theme(axis.title.x = element_text(margin = margin(t = 8, r = 0, b = 0 , l = 0), size = 24),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1, size = 14),
        axis.title.y = element_text(size = 20),
        axis.text.y = element_text(size = 14),
        plot.title = element_text(size = 28),
        text = element_text(family = "Garamond")) 

ggplot(df_disc , aes(x = Year, fill = Langue_rec)) +
  geom_histogram(position="fill", color="#e9ecef", binwidth = 1) +
  labs(x = "Années", y = "Disciplines (%)") +  
  ggtitle("Distribution des langues de rédaction") +
  labs(fill="Langues") +
  theme(plot.margin = margin(1, 1, 1, 1, "cm")) +
  blue_theme()

ggplot(df_disc , aes(x = Year, fill = Langue_rec)) +
  geom_histogram(position="fill", color="#e9ecef", binwidth = 1, alpha = 0.75) +
  labs(x = "Années", y = "Disciplines (%)") +  
  ggtitle("Distribution des langues de rédaction") +
  labs(fill="Langues") +
  theme(plot.margin = margin(2, 3, 2, 2, "cm")) +
  blue_theme()

Exercice 5

# Passage en échelle log10 pour les ordonnées
ggplot(df_disc , aes(x = Year, fill = Langue_rec)) +
  geom_histogram(position="fill", color="#e9ecef", binwidth = 1) +
  scale_y_log10() + 
  labs(x = "Années", y = "Disciplines (log)") +  
  ggtitle("Distribution des langues de rédaction") +
  labs(fill="Langues") +
  theme(plot.margin = margin(1, 1, 1, 1, "cm")) +
  blue_theme()

Exercice 6

# reprise du stacked barplot précédent : légende en haut
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") + 
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  theme(legend.position = "top") +
  blue_theme()

# reprise du stacked barplot précédent : légende à gauche
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") +
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  theme(legend.position = "left") + 
  blue_theme() 

# reprise du stacked barplot précédent : légende avec coordonnées
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") +
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  theme(legend.position = c(0.95,0.5)) + 
  blue_theme() 

Exercice 7

# reprise du stacked barplot précédent : modification de la palette de couleur
## Chargement de la palette 
library(viridis)
## Le chargement a nécessité le package : viridisLite
# Modification du plot : viridis de base
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") + 
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  blue_theme() + 
  theme(legend.position = "top") + 
  scale_fill_viridis(discrete = TRUE) # Appliquer la palette viridis à des données discrètes/catégorielles

# Modification du plot : viridis inferno
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") + 
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  blue_theme() + 
  theme(legend.position = "top") + 
  scale_fill_viridis(discrete = TRUE, option="inferno") # Appliquer la palette viridis (inferno) à des données discrètes/catégorielles

# Modification du plot : viridis plasma
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") + 
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  blue_theme() + 
  theme(legend.position = "top") + 
  scale_fill_viridis(discrete = TRUE, option="plasma") # Appliquer la palette viridis (inferno) à des données discrètes/catégorielles

Exercice 8

# modification de l'ordre des disciplines
df_disc.an2$Discipline_predi_F <- factor(df_disc.an2$Discipline_predi)
myLevels <- levels(df_disc.an2$Discipline_predi_F)
disc_inv <- factor(df_disc.an2$Discipline_predi_F, levels = rev(myLevels)) # inverser l'ordre des niveaux/catégories
  

# Plot : ordre des discipline inversé
ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = disc_inv)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") + 
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  blue_theme() + 
  theme(legend.position = "top") + 
  scale_fill_viridis(discrete = TRUE) # Appliquer la palette viridis à des données discrètes/catégorielles

Exercice 9

df_disc.an2$Date <- as.Date(as.character(df_disc.an2$Year), format="%Y") # passer en format date

# Construire le graphique statique
p <- ggplot(df_disc.an2, aes(x = Date, y = Disc_predi.an, fill = disc_inv)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") + 
  theme(plot.margin = margin(0.5, 2, 0.5, 0, "cm")) +
  blue_theme() + 
  theme(legend.position = "top") + 
  scale_fill_viridis(discrete = TRUE) # Appliquer la palette viridis à des données discrètes/catégorielles


# Création d'un graphique avec rangesliders 

p_plotly <- ggplotly(p, dynamicTicks = TRUE) %>% # Transformer le graphique en graphique plotly
  layout(
    title = "Distribution des thèses par disciplines entre 1985 et 2018\n",
    xaxis = list(
      rangeslider = list(
        type = "date",
        bgcolor = "lightblue",           # Couleur de fond
        bordercolor = "blue",            # Couleur de bordure
        borderwidth = 2,                 # Épaisseur de la bordure
        thickness = 0.1,                 # Épaisseur du slider
        yaxis = list(title = "", fixedrange = TRUE)
      )
    )
  )

# Afficher le graphique
p_plotly
# Catégories
categories <- c("Biologie", "Droit et Science Politique", "Economie Gestion", "Informatique",
                "Langues et Litteratures", "Materiaux, Milieux et Chimie", "Mathematiques",
                "Mathematiques et Informatique", "Medecine", "Poubelle", "Psychologie",
                "Science de l'ingenieur", "Science de la Terre", "Sciences de l'education", "SHS")

# Organiser les catégories
new_order <- c("Medecine", "Biologie", setdiff(categories, c("Medecine", "Biologie")))

# 
df_disc.an2$Discipline_predi <- factor(df_disc.an2$Discipline_predi, levels = new_order)
df_disc.an2$Discipline_predi[df_disc.an2$Discipline_predi == "Poubelle"] <- NA

df_disc.an2 <- df_disc.an2 %>%
  drop_na(Discipline_predi)


# Créer le graphique basic
p2 <- ggplot(df_disc.an2, aes(x = Year, y = Disc_predi.an, fill = Discipline_predi)) +
  geom_area(position = "stack", linewidth = 0.8, na.rm = TRUE) +
  labs(x = "Date", y = "Number of Theses", fill = "Discipline",
       title = "Evolution du nombre de thèses par disciplines",
       subtitle = "Période 1985-2018") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
  
# Création d'un graphique avec rangesliders 

p_plotly2 <- ggplotly(p2, dynamicTicks = TRUE) %>% # Transformer le graphique en graphique plotly
  layout(
    title = "Distribution des thèses par disciplines entre 1985 et 2018\n",
    xaxis = list(
      rangeslider = list(
        type = "date",
        bgcolor = "lightblue",           # Couleur de fond
        bordercolor = "blue",            # Couleur de bordure
        borderwidth = 2,                 # Épaisseur de la bordure
        thickness = 0.1,                 # Épaisseur du slider
        yaxis = list(title = "", fixedrange = TRUE)
      )
    )
  )

# Afficher le graphique
p_plotly2
## Création d'un graphique plotly avec rangeselector
p_plotly <- ggplotly(p, dynamicTicks = TRUE) %>%
  layout(
    title = "Distribution des langues de rédaction\n",
    xaxis = list(
      rangeselector = list(
        buttons = list(
          list(count = 5, label = "5 ans", step = "year", stepmode = "backward"),
          list(count = 10, label = "10 ans", step = "year", stepmode = "backward"),
          list(count = 15, label = "15 ans", step = "year", stepmode = "backward"),
          list(step = "all")
        ),
         x = 0.3,  # Coordonnée x pour le rangeselector
        y = -0.3   # Coordonnée y pour le rangeselector
      )
    )
  )

# Afficher le graphique
p_plotly
df_disc.an2$Date <- as.Date(as.character(df_disc.an2$Year), format="%Y") 

p <- ggplot(df_disc.an2, aes(x = Date, y = Disc_predi.an, fill = disc_inv)) +
  geom_bar(stat = "identity", position = "stack") +
  labs(x = "Années", y = "Disciplines") +  
  ggtitle("Distribution des thèses par disciplines entre 1985 et 2018") +
  labs(fill="Disciplines") +
  theme_minimal() +
  theme(legend.position = "top") + 
  scale_fill_viridis(discrete = TRUE) # Appliquer la palette viridis à des données discrètes/catégorielles

# Transformation en plotly
p_plotly <- ggplotly(p, dynamicTicks = TRUE)

# Définir les étapes pour le slider 
years <- sort(unique(df_disc.an2$Year))

steps <- list()

for(i in seq_along(years)) {
  step <- list(
    args = list("visible", sapply(years, function(y) y <= years[i])),
    label = as.character(years[i]),
    method = "restyle"
  )
  steps[[i]] = step
}

# Ajout du slider
p_plotly2 <- p_plotly %>%
  layout(
    sliders = list(
      list(
        active = length(years) - 1,
        yanchor = "top",
        xanchor = "left",
        currentvalue = list(prefix = "Year: "),
        steps = steps
      )
    )
  )

p_plotly2